package com.zisu.secs.secs.example.example2;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Optional;
import com.zisu.secs.secs.SecsException;
import com.zisu.secs.secs.SecsMessage;
import com.zisu.secs.secs.gem.ACKC6;
import com.zisu.secs.secs.hsmsss.*;
import com.zisu.secs.secs.secs1.Secs1Message;
import com.zisu.secs.secs.secs2.Secs2;


//gem() 只是通常的规范 ，，如果满足业务需求那可以直接用，如果不满足 还是需要手写的 参考s1f17 点进去看详细
public class ExampleHsmsSsActiveUseGem {

	public ExampleHsmsSsActiveUseGem() {
		/* Nothing */
	}
	
	/*
	 * Example-4
	 * 1. open ACTIVE-instance
	 * 2. wait until SELECTED
	 * 3. send S1F13
	 * 4. send S1F17
	 * 
	 */

	public static void main(String[] args) {
		
		HsmsSsCommunicatorConfig config = new HsmsSsCommunicatorConfig();

		//注意一下 配置必须和EQ 端对应上 ，
		config.socketAddress(new InetSocketAddress("127.0.0.1", 8000));
		config.protocol(HsmsSsProtocol.ACTIVE);
		//特别注意 sessionid 就是deviceid  必须和 EQ端对应上 ，原话：SessionID -- must be equal to the value of the session ID in the corresponding Select.req.
		config.sessionId(0);
		config.isEquip(false);
		config.linktest(60.0F);
		config.timeout().t3(45.0F);
		config.timeout().t5(5.0F);
		config.timeout().t6( 10.0F);
		config.timeout().t7(10.0F);
		config.timeout().t8( 10.0F);
		
		try (
			HsmsSsCommunicator comm = HsmsSsCommunicator.newInstance(config);
		) {
			comm.addSecsLogListener(System.out::println);
			
			comm.addSecsMessageReceiveListener(msg -> {
				
				/* Nothing */
				int stream = msg.getStream();
				int function = msg.getFunction();
				String s = msg.toJson();

				if(stream == 6 && function == 11){
					try {
						//ACKC6 表示一种状态码 告诉EQ 我这边（HOST）是成功或者是失败收到了
						comm.gem().s6f12(new Secs1Message(msg.header10Bytes(),msg.secs2()),ACKC6.OK);
					}catch (Exception e){
						e.printStackTrace();
					}
				}

			});
			
			comm.addSecsCommunicatableStateChangeListener(state -> {

				if ( state /* SELECTED */ ) {


					/* send S1F13 W */
					//用gem 会包 07 ，这个请求会被模拟器拒绝
					//comm.gem().s1f13();
//					try {
//						comm.gem().s1f1();
//					} catch (SecsException | InterruptedException e) {
//						e.printStackTrace();
//					}


					//开始   ===

//					/**
//					 * :  'S1F1' W    /*  _E Are You There Request_000029  H->E  */
//					 * 	<A[3] '234' >    *a
//					 *		  .
//					 * */

					HsmsSsMessageType mt = HsmsSsMessageType.DATA;

					byte[] head = new byte[] {
							(byte) 0,
							/**
							 * 如果设备id 错误的话 汇报错
							 * 正确：0(byte) 0(byte)
							 * 错误：0(byte) 10(byte)
							 * HsmsSsRejectException: [00 0A|00 04|00 07|00 00 00 02]
							 * */
							(byte) 0,
							/**
							 * 1 	代表EQ不回复
							 * 129	代表EQ回复
							 * */
							(byte)129,
							(byte)1,
							mt.pType(),
							mt.sType(),
							0,
							0,
							0,
							2
					};
					Secs2 secs2 = Secs2.ascii("234");
					HsmsSsMessage hsmsSsMessage = comm.createHsmsSsMessage(head, secs2);
					try {
						Optional<HsmsSsMessage> send = comm.send(hsmsSsMessage);
					} catch (SecsException e) {
						e.printStackTrace();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					//结束   ===
				}
			});
			
			comm.open();
			
			
			synchronized ( ExampleHsmsSsActiveUseGem.class ) {
				ExampleHsmsSsActiveUseGem.class.wait();
			}
		}
		catch ( InterruptedException ignore ) {
		}
		catch ( IOException e ) {
			e.printStackTrace();
		}
	}

}
